// 函数是一组一起执行一个任务的语句
// function function_name():return_type { 
//     // 语句
//     return value; 
// }
// return_type 是返回值的类/。

// return 关键词后跟着要返回的结果。

// 一般情况下，一个函数只有一个 return 语句。

// 返回值的类型需要与函数定义的返回类型(return_type)一致。
//  函数 返回的时候必须定义 那么定义在哪里了
//  return 关键词 后面更返回的结果
//  一般情况下 一个函数只有个reter 语句
//  返回值得类型需要与函数定义的返回类型返回值的类型需要与函数定义的返回类型(return_type)一致

function greet():string {
    return '你好'
}

function caller() {
        var  msg = greet()//调用gree函数
       console.log(msg);
       
    }
caller()
// TypeScript
function add(x: number, y: number): number {
    return x + y;
}
console.log(add(1,2))
// 实例中定义了函数 add()，返回值的类型为 number。

// add() //函数中定义了两个 number 类型的参数，函数内将两个参数相加并返回。
// 函数中有时候有的函数我们其实不想要选 就可以设置为？
// 在 TypeScript 函数里，如果我们定义了参数，则我们必须传入这些参数，除非将这些参数设置为可选，可选参数使用问号标识 ？。
// 实例
function buildName(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName;
}
 
let result1 = buildName("Bob");  // 正确
// let result2 = buildName("Bob", "Adams", "Sr.");  // 错误，参数太多了
let result3 = buildName("Bob", "Adams");  // 正确
// 导致 可以用也可以不用的
// 我们也可以设置参数的默认值，这样在调用函数的时候，如果不传入该参数的值，则使用默认参数，语法格式为：

// function function_name(param1[:type],param2[:type] = default_value) { 
// }
// 注意：参数不能同时设置为可选和默认。
// 实例

// 以下实例函数的参数 rate 设置了默认值为 0.50，调用该函数时如果未传入参数则使用该默认值：

// TypeScript
function calculate_discount(price:number,rate:number = 0.50) { 
    var discount = price * rate; 
    console.log("计算结果: ",discount); 
} 
calculate_discount(1000) 
calculate_discount(1000,0.30)
// 这里就是 参数里面设置 默认参数的设置
// 有一种情况，我们不知道要向函数传入多少个参数，这时候我们就可以使用剩余参数来定义。

// 剩余参数语法允许我们将一个不确定数量的参数作为一个数组传入。

// TypeScript
// function buildName(firstName: string, ...restOfName: string[]) {
//     return firstName + " " + restOfName.join(" ");
// }
  
// let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
// var res = function(a:number,b:number) { 
    // return a*b;  
// }; 
// console.log(res(12,2))

//   递归函数

// function factorial(number) {
//     if (number <= 0) { // 停止执行
//         return 1;
//     }
//     else {
//         return (number * factorial(number - 1)); // 调用自身
//     }
// }
// ;
// console.log(factorial(6)); // 输出 720

//  下面就是重载
// TypeScript
// function disp(s1:string):void; 
// function disp(n1:number,s1:string):void; 
 
// function disp(x:any,y?:any):void { 
//     console.log(x); 
//     console.log(y); 
// } 
// disp("abc") 
// disp(1,"xyz");
// 编译以上代码，得到以下 JavaScript 代码：

// JavaScript
// function disp(x, y) {
//     console.log(x);
//     console.log(y);
// }
// disp("abc");
// disp(1, "xyz");